#!/bin/bash
#
# Copyright (c) 2018 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

#---------------------------------------------------------------------
# Description: Bash tab completion script.
#---------------------------------------------------------------------

_kataruntime='kata-runtime'

# Return a list of sub-commands
_kata_get_subcmds()
{
    "$_kataruntime" --generate-bash-completion
}

# Return a list of options for the specified sub-command
#
# Limitation: Note that this only supports long-options.
_kata_get_subcmd_options()
{
    local subcmd="$1"

    "$_kataruntime" "$subcmd" --help |\
        egrep -- "^ *--[^ ]*[ ][^ ]*" |\
        awk '{print $1}' |\
        tr -d \, |\
        sort
}

# Return a list of global options
_kata_get_global_options()
{
    _kata_get_subcmd_options ""
}

# Return name of subcmd already seen, or ""
_kata_subcmd_seen()
{
    local subcmds=$(_kata_get_subcmds)
    local cmd

    for cmd in $subcmds; do
        local word
        for word in ${COMP_WORDS[@]}; do
            [ "$cmd" = "$word" ] && echo "$cmd"
        done
    done

    echo ""
}

# Return 0 if the specified sub-command requires the name of an
# *existing* container, else 1.
_kata_subcmd_needs_existing_container()
{
    local subcmd="$1"
    local cmd

    for cmd in \
	    'kata-check' \
	    'kata-env' \
	    'create' \
	    'help' \
	    'list' \
	    'version'; do
        [ "$cmd" = "$subcmd" ] && return 1
    done

    return 0
}

# Returns a list of container names
_kata_get_containers()
{
    # Commands that manipulate containers need root privileges.
    # If the user isn't running as root, don't attempt to obtain a list
    # as it will result in an error.
    [ $(id -u) -eq 0 ] || return

    "$_kataruntime" list --quiet
}

_kata_bash_autocomplete() {
    COMPREPLY=()

    local opts opt

    local cur="${COMP_WORDS[COMP_CWORD]}"

    for opt in \
        '-h' '--help' 'help' \
        '-v' '--version' 'version';
    do
        # No further completions possible for these commands
        [ "$cur" = "$opt" ] && return 0
    done

    local subcmd_seen=$(_kata_subcmd_seen)

    if [ -n "$subcmd_seen" ]; then
	    _kata_subcmd_needs_existing_container "$subcmd_seen"
	    local container_cmd=$?

            if [ -n "$cur" ]; then
                    # Complete with local options and maybe container names
                    opts=$(_kata_get_subcmd_options "$subcmd_seen")
                    [ $container_cmd -eq 0 ] && opts="$opts $(_kata_get_containers)"
            elif [[ "${cur}" == -* ]]; then
                    # Complete with local options
                    opts=$(_kata_get_subcmd_options "$subcmd_seen")
            else
                    # Potentially complete with container names
                    [ $container_cmd -eq 0 ] && opts="$(_kata_get_containers)"
            fi
    else
            if [ -n "$cur" ]; then
                    # Complete with global options and subcmds
                    opts="$opts $(_kata_get_global_options)"
                    opts="$opts $(_kata_get_subcmds)"
            elif [[ "${cur}" == -* ]]; then
                    # Complete with global options
                    opts=$(_kata_get_global_options)
            else
                    # Complete with subcmds
                    opts=$(_kata_get_subcmds)
            fi
    fi

    [ -n "$opts" ] && COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )

    return 0
}

complete -F _kata_bash_autocomplete "$_kataruntime"
